//
//  CZStatus.swift
//  GZWeibo009
//
//  Created by gzxzmac on 16/3/24.
//  Copyright © 2016年 gzxzmac. All rights reserved.
//

import UIKit

/// 微博模型
class CZStatus: NSObject {
    /// 微博创建时间
    var created_at: String?
    
    /// 微博ID
    var id: Int64 = 0
    
    /// 微博信息内容
    var text: String?
    
    /// 微博来源
    var source: String? {
        didSet {
            source = source?.sinaSource()
        }
    }
    
    /// 微博配图,服务器返回的是数组,数组里面又是字典,后续操作不方便,需要解析字典,当KVC的时候,模型来提供图片URL地址数组
    var pic_urls: [[String: AnyObject]]? {
        didSet {
            // 解析出[[String: AnyObject]]里面的图片地址,转成NSURL放到storePictureURLs数组里面来,以后外面访问就比较方便了
            
            if pic_urls?.count == 0 {
                return
            }
            
            // 真的有图片
            storePictureURLs = [NSURL]()
            
            // 遍历 pic_urls
            for dict in pic_urls! {
                // 解析 这个key: thumbnail_pic
                //                if let urlString = dict["thumbnail_pic"] as? String {
                //                    // 可选绑定,有值才进来
                //                    // http://ww4.sinaimg.cn/thumbnail/6a127c7ejw1f2b583sj38j20k00zktbo.jpg
                //                    // czbk://www.baidu.com
                //                    // 创建NSURL
                //                    if let url = NSURL(string: urlString) {
                //
                //                        // 可选绑定,有值才进来
                //                        storePictureURLs?.append(url)
                //                    }
                //                }
                
                // if let 可选绑定会导致代码嵌套过多,提供守卫
                guard let urlString = dict["thumbnail_pic"] as? String else {
                    // 和可选绑定相反,没有值才进来urlString可以带代码块外面用
                    print("没有值")
                    continue
                    // break
                    //                    return
                }
                
                // 能到下面来 urlString 有值
                // 创建url
                guard let url = NSURL(string: urlString) else {
                    print("url没有值")
                    continue
                }
                
                storePictureURLs?.append(url)
            }
        }
    }
    
    /// 微博配图,里面存储的是 微博配图的url地址
    var storePictureURLs: [NSURL]?
    
    /// 转发数
    var reposts_count: Int = 0
    
    /// 评论数
    var comments_count: Int = 0
    
    /// 表态数
    var attitudes_count: Int = 0
    
    /// 微博模型里面有一个user,用户模型,虽然定义的是CZUser模型,KVC并不会自动将user字典(服务器返回的是字典)转成模型,会将user原来的内容(字典)赋值user属性
    /// 需要在KVC字典转模型的时候,拦截user这个属性的设置,自己来将字典转成CZUser
    var user: CZUser?
    
    /// 被转发的微博
    var retweeted_status: CZStatus?
    
    /// 字典转模型
    init(dict: [String: AnyObject]) {
        super.init()    // 创建对象
        
        // 使用KVC字典转模型
        setValuesForKeysWithDictionary(dict)
    }
    
    // setValuesForKeysWithDictionary方法实际上回调用setValue:forKey:
    // setValuesForKeysWithDictionary,获取字典里面的每一个key,字典里面有多少个key就会调用多少次setValue:forKey:,如果这个key在模型中找不到对应的属性,就调用setValue:forUndefinedKey,如果找的到就直接使用kvc赋值
    override func setValue(value: AnyObject?, forKey key: String) {
        //        print("setValue: \(value) forKey: \(key)")
        // 拦截当key = user时候我们自己来处理(因为setValue:forKey:这个方法会将服务器返回的字典赋值给user属性),所以我们自己拦截这个user这个key,自己来字典转模型
        if key == "user" {
            // 获取value
            if let dict = value as? [String: AnyObject] {
                // 字典转模型,给user赋值
                user = CZUser(dict: dict)
            }
            
            // 注意:我们拦截这个user,自己字典转模型,赋值给status的user属性,不要让他在调用父类的super.setValue(value, forKey: key)
            return
        }
        
        // 拦截retweeted_status自己来转模型
        if key == "retweeted_status" {
            // 获取value
            if let dict = value as? [String: AnyObject] {
                retweeted_status = CZStatus(dict: dict)
            }
            
            return
        }
        
        super.setValue(value, forKey: key)
    }
    
    /// 字典里面的key在模型中找不到对应的属性
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    }
    
    /// 对象打印
    override var description: String {
        // 只读计算型属性
        let keys = ["created_at", "id", "text", "source", "pic_urls", "reposts_count", "comments_count", "attitudes_count", "user"]
        
        return "\n \t微博模型: \(dictionaryWithValuesForKeys(keys).description)"
        //        get {
        //        }
    }
}
